/*
1：安装与导入axios
2:创建axios副本
3：加入请求拦截与响应拦截
4：暴露出去
5：api/文件.js导入使用
*/
import axios from 'axios'
import { Message } from 'element-ui' // Message====this.$message
import store from '@/store'
import router from '@/router'
const _axios = axios.create({
  // 二环境：开发环境   生产环境
  // 上线前一到二天不允许动代码，人力成本
  // 当执行npm run serve/dev 自动使用开发环境的接口基地址
  // 当执行npm run build 自动使用生产环境的接口基地址
  // 值（环境变量）动态改变
  // process.env.NODE_ENV：vue-cli已包装好的
  // 手动创建环境变量
  /*
  开发环境的环境变量（npm run dev）
  创建开发环境的环境变量
    a:在根目录（package.json同级目录）创建一个.env.development文件
    b:文件内定义变量
        规则：以VUE_APP_开头   ＶＵＥ＿ＡＰＰ＿ＵＲＬ＝＇值＇
    访问：process.env.VUE_APP_URL
    注意：一定要重启脚手架
  生产环境的环境变量(npm run build)
  创建生产环境的环境变量
    a:在根目录（package.json同级目录）创建一个.env.production文件
    b:文件内定义变量
        规则：以VUE_APP_开头   ＶＵＥ＿ＡＰＰ＿ＵＲＬ＝＇值＇
    访问：process.env.VUE_APP_URL
    注意：一定要重启脚手架

  */
  baseURL: process.env.VUE_APP_URL // 本地启动成功
})
_axios.interceptors.request.use(
  (config) => {
    // console.log(3)
    /*
    1:随便加token,不需要加的接口加了不会报错
    2：不需要加的加了直接报错
       怎么解决？
           在请求api配制中；加入noToken为true
           在请求拦截中识别noToken统一处理
    */
    // console.log(config)
    if (!config.noToken) {
      config.headers.Authorization = `Bearer ${store.state.user.token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)
// 响应
_axios.interceptors.response.use(
  // 接口状态码以2开头是成功
  // 掊口统一错误处理
  (res) => {
    // console.log(4)
    // 正常（success:true）
    if (res.data.success) {
      return res.data // 接口.then（await后面代码的）的执行
    } else {
      // 非正常
      // 1：提示错误信息  2：中止.then的执行
      Message.error(res.data.message)
      return Promise.reject(new Error(res.data.message))
    }
  },
  // 非2开头
  (error) => {
    // 统一token失效处理
    if (error.response && error.response.status === 401) {
      // token失效
      // 清除token与用户信息
      store.commit('user/logout')
      router.push('/login?redirect=' + location.href.split('#')[1])
      return Promise.reject(new Error(error.response.data.message))
    }
    return Promise.reject(error)
  }
)
export default _axios
